Unlike guards and interceptors (global → controller → method), exception filters resolve in reverse: method → controller → global. The most specific, narrowest-scoped filter whose @Catch() type matches the thrown exception handles it. Wider-scoped filters only run as fallbacks when no narrower filter matches.
Resolution order: method-level first, then controller-level, then global.
This is the OPPOSITE of guards and interceptors which run global -> controller -> method.
The first filter whose @Catch() type matches the thrown exception handles it exclusively.
@Catch(NotFoundException) will NOT handle BadRequestException — types must match exactly.
@Catch() with no argument at global level acts as the final catch-all safety net.